// Copyright (c) 1996-99 The Regents of the University of California. All
// Rights Reserved. Permission to use, copy, modify, and distribute this
// software and its documentation without fee, and without a written
// agreement is hereby granted, provided that the above copyright notice
// and this paragraph appear in all copies.  This software program and
// documentation are copyrighted by The Regents of the University of
// California. The software program and documentation are supplied "AS
// IS", without any accompanying services from The Regents. The Regents
// does not warrant that the operation of the program will be
// uninterrupted or error-free. The end-user understands that the program
// was developed for research purposes and is advised not to rely
// exclusively on the program for any reason.  IN NO EVENT SHALL THE
// UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
// ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
// THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
// PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
// CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
// UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

// File: ArrowHead.java
// Classes: ArrowHead
// Original Author: abonner@ics.uci.edu
// $Id: ArrowHeadGreater.java 1238 2009-06-27 17:26:13Z bobtarling $

package org.tigris.gef.presentation;

import java.awt.*;

/** Draws a triangular arrow head at the end of a FigEdge */

public class ArrowHeadGreater extends ArrowHead {

    private static final long serialVersionUID = 4300767437944516708L;

    public void paint(Graphics g, Point start, Point end, Color lineColor, Color fillColor) {

        Point[] points = fetchCache(start, end);

        Graphics graphics = (Graphics) g;
        graphics.setColor(lineColor);
        graphics.drawLine(points[0].x, points[0].y, points[1].x, points[1].y);
        graphics.drawLine(points[1].x, points[1].y, points[2].x, points[2].y);
    }



    public void appendSvg(boolean head, Fig fig, StringBuffer sb) {
        Point[] points = head ? getHeadPoints(fig) : getTailPoints(fig);
        if (points == null || points.length == 0) return;

        sb.append("<path ");
        appendSvgStyle(sb);
        sb.append(" d='M" + points[0].x + " " + points[0].y);
        for (int i = 1; i < points.length; i++) {
            sb.append(" L" + points[i].x + " " + points[i].y);
        }
        sb.append("'/>");
    }

    public Point[] getArrowPoints(Point start, Point end) {
        int xFrom, xTo, yFrom, yTo;
        double denom, x, y, dx, dy, cos, sin;

        xFrom = start.x;
        xTo = end.x;
        yFrom = start.y;
        yTo = end.y;

        dx = (double) (xTo - xFrom);
        dy = (double) (yTo - yFrom);
        denom = dist(dx, dy);
        if (denom == 0) {
            return null;
        }

        cos = getHeight() / denom;
        sin = getWidth() / denom;
        x = xTo - cos * dx;
        y = yTo - cos * dy;
        int x1 = (int) (x - sin * dy);
        int y1 = (int) (y + sin * dx);
        int x2 = (int) (x + sin * dy);
        int y2 = (int) (y - sin * dx);
        return new Point[] {
            new Point(x1, y1),
            new Point(xTo, yTo),
            new Point(x2, y2)
        };
    }

    public boolean isFilled() {
        return false;
    }
}
